import axios from 'axios'
import { ElMessage } from 'element-plus'
import { useAppStore } from '@/stores/app'
import { apiLogger } from './logger.js'
import { sanitizeData } from './logConfig.js'

// 创建axios实例
const api = axios.create({
  baseURL: '/api',
  timeout: 300000, // 增加到300秒（5分钟），适应大表COUNT查询
  headers: {
    'Content-Type': 'application/json'
  }
})

// 请求拦截器
api.interceptors.request.use(
  (config) => {
    const startTime = Date.now()
    config.metadata = { startTime }
    
    // 记录请求开始
    apiLogger.debug(`API Request: ${config.method?.toUpperCase()} ${config.url}`, {
      params: sanitizeData(config.params),
      data: sanitizeData(config.data),
      headers: config.headers
    })
    
    // 排除不需要flink_env参数的API
    const excludedApis = [
      'register-single-to-flink',
      'upload-temp',
      'callback',  // 回调数据管理相关API
      'stats',     // 统计API
      'data',      // 数据查询API
      'clear',     // 清空API
      'status',    // 状态API
      'control',   // 控制API
      'export',    // 导出API
      'test-connection',  // 连接测试API
      'settings',   // 设置相关API
      'starrocks-error' // StarRocks 错误日志接口无需追加 flink_env
    ]
    
    if (config.url && excludedApis.some(api => config.url.includes(api))) {
      return config
    }
    
    // 添加Flink环境参数（使用完整URL，而不是环境名）
    // 如果请求中已经指定了 flink_env，则不覆盖
    if (!config.params?.flink_env) {
      const appStore = useAppStore()
      try {
        const envCfg = appStore.getCurrentFlinkEnvConfig?.()
        if (envCfg && envCfg.host) {
          const protocol = envCfg.protocol || 'http'
          const host = envCfg.host || ''
          const port = envCfg.port ? `:${envCfg.port}` : ''
          const path = envCfg.path || ''
          const fullEnvUrl = `${protocol}://${host}${port}${path}`
          config.params = {
            ...config.params,
            flink_env: fullEnvUrl
          }
        } else if (appStore.currentFlinkEnv) {
          // 构建完整URL而不是传递环境名
          const allEnvs = appStore.flinkEnvironments || []
          const currentEnv = allEnvs.find(env => env.name === appStore.currentFlinkEnv)
          if (currentEnv && currentEnv.host) {
            const protocol = currentEnv.protocol || 'http'
            const host = currentEnv.host || ''
            const port = currentEnv.port ? `:${currentEnv.port}` : ''
            const path = currentEnv.path || ''
            const fullEnvUrl = `${protocol}://${host}${port}${path}`
            config.params = {
              ...config.params,
              flink_env: fullEnvUrl
            }
          }
        }
      } catch (e) {
        // 记录错误但不影响请求
        apiLogger.warn('Failed to add flink_env parameter', e)
      }
    }
    return config
  },
  (error) => {
    apiLogger.error('Request interceptor error', error)
    return Promise.reject(error)
  }
)

// 响应拦截器
api.interceptors.response.use(
  (response) => {
    // 计算请求耗时
    const duration = response.config.metadata ? Date.now() - response.config.metadata.startTime : 0
    
    // 记录成功响应
    apiLogger.api(
      response.config.method?.toUpperCase() || 'GET',
      response.config.url || '',
      response.status,
      duration,
      sanitizeData(response.config.data),
      null // 成功响应不记录响应数据，减少日志量
    )
    
    return response
  },
  (error) => {
    // 计算请求耗时
    const duration = error.config?.metadata ? Date.now() - error.config.metadata.startTime : 0
    
    // 记录错误响应
    if (error.response) {
      const { status, data } = error.response
      
      apiLogger.api(
        error.config?.method?.toUpperCase() || 'GET',
        error.config?.url || '',
        status,
        duration,
        sanitizeData(error.config?.data),
        sanitizeData(data)
      )
      
      switch (status) {
        case 400:
          ElMessage.error(data.error || '请求参数错误')
          break
        case 401:
          ElMessage.error('未授权访问')
          break
        case 403:
          ElMessage.error('禁止访问')
          break
        case 404:
          ElMessage.error('资源不存在')
          break
        case 500:
          ElMessage.error(data.error || '服务器内部错误')
          break
        default:
          ElMessage.error(data.error || '请求失败')
      }
    } else if (error.request) {
      apiLogger.error('Network error', {
        message: '网络连接失败',
        config: sanitizeData(error.config)
      }, error)
      ElMessage.error('网络连接失败，请检查网络')
    } else {
      apiLogger.error('Request configuration error', {
        message: error.message,
        config: sanitizeData(error.config)
      }, error)
      ElMessage.error('请求配置错误')
    }
    
    return Promise.reject(error)
  }
)

export default api
